home *** CD-ROM | disk | FTP | other *** search
- ;DROPSY TEXT effect for Nowhere Man's VCL - TASM will assemble as is using
-
- ;VCL recommended switches. When screen is thoroughly dropsie'd, that is all
-
- ;letters have fallen to a single line across the bottom of the monitor,
-
- ;the routine will exit to DOS and restore the command prompt. I excerpted
-
- ;quite a bit of this from some public domain video routines optimized for
-
- ;the accursed a86 assembler and reworked the whole magilla until TASM
-
- ;wouldn't choke when swallowing the source. It attempts to meet
-
- ;minimum requirements for VCL formatting. Heck, this is a nice routine
-
- ;to have at your fingertips; you gotta admit a CASCADE-virus-like effect
-
- ;is always something people wanna see. And it's commented up the
-
- ;kazoo, one of the features I like best about VCL code. Hope you find
-
- ;it useful. -URNST KOUCH
-
-
-
- code segment byte public
-
- assume cs:code,ds:code,es:code,ss:code
-
- org 0100h
-
-
-
- jmp Start
-
-
-
- main proc near
-
-
-
- Row dw 24 ;Rows to do initially
-
-
-
- ;First, get current video mode and page.
-
- Start: mov cx,0B800h ;color display, color video mem for page 1
-
- mov ah,15 ;Get current video mode
-
- int 10h
-
- cmp al,2 ;Color?
-
- je A2 ;Yes
-
- cmp al,3 ;Color?
-
- je A2 ;Yes
-
- cmp al,7 ;Mono?
-
- je A1 ;Yes
-
- int 20h ;No,quit
-
-
-
- ;here if 80 col text mode; put video segment in ds.
-
- A1: mov cx,0A300h ;Set for mono; mono videomem for page 1
-
- A2: mov bl,0 ;bx=page offset
-
- add cx,bx ;Video segment
-
- mov ds,cx ;in ds
-
-
-
- ;start dropsy effect
-
- xor bx,bx ;Start at top left corner
-
- A3: push bx ;Save row start on stack
-
- mov bp,80 ;Reset column counter
-
- ;Do next column in a row.
-
- A4: mov si,bx ;Set row top in si
-
- mov ax,[si] ;Get char & attr from screen
-
- cmp al,20h ;Is it a blank?
-
- je A7 ;Yes, skip it
-
- mov dx,ax ;No, save it in dx
-
- mov al,20h ;Make it a space
-
- mov [si],ax ;and put on screen
-
- add si,160 ;Set for next row
-
- mov di,cs:Row ;Get rows remaining
-
- A5: mov ax,[si] ;Get the char & attr from screen
-
- mov [si],dx ;Put top row char & attr there
-
- A6: call Vert ;Wait for 2 vert retraces
-
- mov [si],ax ;Put original char & attr back
-
- ;Do next row, this column.
-
- add si,160 ;Next row
-
- dec di ;Done all rows remaining?
-
- jne A5 ;No, do next one
-
- mov [si-160],dx ;Put char & attr on line 25 as junk
-
- ;Do next column on this row.
-
- A7: add bx,2 ;Next column, same row
-
- dec bp ;Dec column counter; done?
-
- jne A4 ;No, do this column
-
- ;Do next row.
-
- A8: pop bx ;Get current row start
-
- add bx,160 ;Next row
-
- dec cs:Row ;All rows done?
-
- jne A3 ;No
-
- A9: mov ax,4C00h
-
- int 21h ;Yes, quit to DOS with error code
-
-
-
- ;routine to deal with snow on CGA screen.
-
- Vert: push ax
-
- push dx
-
- push cx ;Save all registers used
-
- mov cl,2 ;Wait for 2 vert retraces
-
- mov dx,3DAh ;CRT status port
-
- F1: in al,dx ;Read status
-
- test al,8 ;Vert retrace went hi?
-
- je F1 ;No, wait for it
-
- dec cl ;2nd one?
-
- je F3 ;Yes, write during blanking time
-
- F2: in al,dx ;No, get status
-
- test al,8 ;Vert retrace went low?
-
- jne F2 ;No, wait for it
-
- jmp F1 ;Yes, wait for next hi
-
- F3: pop cx
-
- pop dx
-
- pop ax ;Restore registers
-
- ret ;and return
-
-
-
- main endp
-
- code ends
-
- end main
-
-